package br.senac.notafiscal.managedbean;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.model.SelectItem;

import org.primefaces.event.SelectEvent;

import br.senac.notafiscal.datamodel.ProdutoDataModel;
import br.senac.notafiscal.entity.Cliente;
import br.senac.notafiscal.entity.ItemNotaFiscal;
import br.senac.notafiscal.entity.NotaFiscal;
import br.senac.notafiscal.entity.Produto;
import br.senac.notafiscal.service.NotaFiscalService;

@ManagedBean
@SessionScoped
public class NotaFiscalMB {
	private NotaFiscal notaFiscal;
	private NotaFiscalService notaFiscalService;
	private Produto selectedProduto;
	private ProdutoDataModel produtoDataModel;
	private ItemNotaFiscal itemNotaFiscal;

	public NotaFiscalMB() {
		notaFiscalService = new NotaFiscalService();
		
		novo();
	}

	public List<SelectItem> getClientes() {
		List<Cliente> clientes = notaFiscalService.listaCliente();
		List<SelectItem> selectItems = new ArrayList<SelectItem>();

		for (Cliente cliente : clientes) {
			selectItems.add(new SelectItem(cliente, cliente.getNome()));
		}

		return selectItems;
	}

	public void novo() {
		notaFiscal = new NotaFiscal();
		notaFiscal.setDataCompra(new Date());
		itemNotaFiscal = new ItemNotaFiscal();
		selectedProduto = null;
		produtoDataModel = new ProdutoDataModel(getProdutos());
	}

	public NotaFiscal getNotaFiscal() {
		return notaFiscal;
	}

	public void setNotaFiscal(NotaFiscal notaFiscal) {
		this.notaFiscal = notaFiscal;
	}

	public List<Produto> getProdutos() {

		return notaFiscalService.listaProduto();
	}
	public List<NotaFiscal> getListaNotasFiscais() {
		return notaFiscalService.listaNotasFiscais();
	}

	private void atualizaValores() {
		notaFiscal.setValorTotal(0d);
		if (notaFiscal.getItensNotaFiscal() != null) {
			for (ItemNotaFiscal item : notaFiscal.getItensNotaFiscal()) {
				item.setValor(item.getQuantidade()
						* item.getProduto().getValor());
				notaFiscal.setValorTotal(notaFiscal.getValorTotal()
						+ item.getValor());
			}
		}

	}

	public void onRowSelect(SelectEvent event) {
		Produto produto = (Produto) event.getObject();
		
		itemNotaFiscal = new ItemNotaFiscal();
		itemNotaFiscal.setNotaFiscal(notaFiscal);
		itemNotaFiscal.setProduto(produto);
		itemNotaFiscal.setQuantidade(0);
		itemNotaFiscal.setValor(0d);
	}
	
	public void salvar()
	{
		notaFiscalService.salvarNotaFiscal(notaFiscal);
		
	}

	public Produto getSelectedProduto() {
		return selectedProduto;
	}

	public void setSelectedProduto(Produto selectedProduto) {
		this.selectedProduto = selectedProduto;
	}

	public ProdutoDataModel getProdutoDataModel() {
		return produtoDataModel;
	}

	public void setProdutoDataModel(ProdutoDataModel produtoDataModel) {
		this.produtoDataModel = produtoDataModel;
	}
	
	public void adicionarProduto()
	{
		this.notaFiscal.getItensNotaFiscal().add(itemNotaFiscal);
		atualizaValores();
		itemNotaFiscal = new ItemNotaFiscal();
		selectedProduto = null;
	}

	public ItemNotaFiscal getItemNotaFiscal() {
		return itemNotaFiscal;
	}

	public void setItemNotaFiscal(ItemNotaFiscal itemNotaFiscal) {
		this.itemNotaFiscal = itemNotaFiscal;
	}
	
	public void atualizaTotalProduto(AjaxBehaviorEvent event)
	{
		this.itemNotaFiscal.setValor(this.itemNotaFiscal.getProduto().getValor() * this.itemNotaFiscal.getQuantidade());
	}
	
	public void excluir()
	{
		notaFiscalService.excluirNotaFiscal(notaFiscal);
	}
}
